package com.lagou.task17;

import java.io.*;

public class FileCharCopyTest {
    public static void copy(String path1,String path2){
        FileReader fr1 = null;
        FileWriter fw1 = null;
        try {
//        1.创建FileReader对象关联文件path1
            fr1 = new FileReader(path1);
//        2.从文件中读取数据到数组中保存并打印出来
//            char[] carr = new char[20];
//            fr1.read(carr);
//        3.创建FileWriter对象关联文件path2
            fw1 = new FileWriter(path2);
//        4.写入数据到文件path2
            int res = 0;
            while ((res = fr1.read()) != -1){
                fw1.write(res);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != fr1) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fw1) {
                try {
                    fw1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static void copy2(String path1,String path2){
        FileInputStream fr1 = null;
        FileOutputStream fw1 = null;
        try {
//        1.创建FileInputStream对象关联文件path1
            fr1 = new FileInputStream(path1);
//        2.从文件中读取数据到数组中保存并打印出来
//            char[] carr = new char[20];
//            fr1.read(carr);
//        3.创建FileOutputStream对象关联文件path2
            fw1 = new FileOutputStream(path2);
//        4.写入数据到文件path2
            int res = 0;
            while ((res = fr1.read()) != -1){
                fw1.write(res);
            }
            System.out.println("拷贝完成");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != fr1) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fw1) {
                try {
                    fw1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static void copy3(String path1,String path2){
        FileInputStream fr1 = null;
        FileOutputStream fw1 = null;
        try {
//        1.创建FileInputStream对象关联文件path1
            fr1 = new FileInputStream(path1);
            int len = fr1.available();
            System.out.println();
//        2.从文件中读取数据到数组中保存并打印出来
            byte[] carr = new byte[len];
            fr1.read(carr);
//        3.创建FileOutputStream对象关联文件path2
            fw1 = new FileOutputStream(path2);
//        4.写入数据到文件path2
            fw1.write(carr);
            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != fr1) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fw1) {
                try {
                    fw1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static void copy4(String path1,String path2){
        FileInputStream fr1 = null;
        FileOutputStream fw1 = null;
        try {
//        1.创建FileInputStream对象关联文件path1
            fr1 = new FileInputStream(path1);
//        2.从文件中读取数据到数组中保存并打印出来
            byte[] carr = new byte[1024];
//        3.创建FileOutputStream对象关联文件path2
            fw1 = new FileOutputStream(path2);
//        4.写入数据到文件path2
            int res = 0;
            while ((res = fr1.read(carr)) != -1){
                fw1.write(carr,0,res);
            }
            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != fr1) {
                try {
                    fr1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != fw1) {
                try {
                    fw1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static void main(String[] args) {
        //字符流文本文件的拷贝
//        copy("./a.txt","./b.txt");

        //方式一字节流图片的拷贝,可以拷贝图片和音频文件但是速度很慢，
        //缺点1：以单个字节为单位，文件稍大，效率太低
//        copy2("知心爱人.mp3","知心爱人1.mp3");



        //方式二获取一个和文件一样大小的缓冲区，一次性将文件内容取出到缓冲区，在一次性写入到文件
//        缺点:若文件过大时无法申请和文件一样大小的缓冲区，真实物理内存不足
//        copy3("知心爱人.mp3","知心爱人1.mp3");

        //方式三准备一个相对合理的缓冲区，分多次拷贝完成
        long time1 = System.currentTimeMillis();
        copy4("知心爱人.mp3","知心爱人1.mp3");
        long time2 = System.currentTimeMillis();
        System.out.println("使用文件流时间：" +(time2-time1));


    }
}
